package com.yms.socket.client;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

//*
// * @version : 1.0
// * @author: yangmingsong
// * @date: 2022/7/1-07-01-14:52
// * @description: spring5Test


public class BIOClient {

    public static void main(String[] args) throws IOException {
        productServer();

    }

    private static void productServer(){
        try {
            //2、服务端通过accept方法用于监听客户端Socket请求
            Socket socket = new Socket("127.0.0.1",1023);
            //3、从Socket中获取字节输入或输出流进行数据得读写传输
            InputStream inputStream = socket.getInputStream();
            //4、将字节输入流包装成一个缓冲字符输入流 这里是将socket监听到的数据从内核数据区复制到内核缓存区
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            Scanner scanner = new Scanner(System.in);

            //生产客户端
            OutputStream outputStream = socket.getOutputStream();
            PrintStream printStream = new PrintStream(outputStream);
            new Thread(){
                @Override
                public void run() {
                    while (true){
                        String str = scanner.next();
//                        这里是将数据从用户数据区复制到用户缓存区
                        printStream.println(str);
                        printStream.flush();
//                        用户进程发起IO-write system call，内核开始将处于用户缓存中的数据复制到内核缓存区，最后内核通过write操作将内核缓存区的数据发送给socket服务端
                    }
                }
            }.start();
            new Thread(){
                @Override
                public void run() {
                    String s = null;
                    while (true){
                        try {
                            if (!((s = bufferedReader.readLine()) != null)) {break;};
//                            用户进程发起IO-read系统调用，用户进程此时就进入了阻塞状态，当系统内核收到read system call 后，于是开始准备数据
//                            一开始数据还没进入内核缓存区，这时内核就处于等待，内核会一直等待完整的数据进入内核缓存区，当数据完整到达后，内核就开始
//                            处理数据，将数据从内核缓存区复制到用户缓存区，当复制完成后，内核会将处理结果，返回给用户进程，最终，用户进程开始读取处于用户缓存区的数据
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        System.out.println("客户端2发来得消息"+s);
                    }
                }
            }.start();

        }catch (Exception e){
            System.out.println("404了--------");
        }
    }
}
